package maps;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

public class SetDemo {
	public static void main(String[] args) {
		//创建Set集合，用于存储String类型的对象元素，使用HashSet作为具体实现
		Set<String> set = new HashSet<>();
		//添加数据
		set.add("hello");
		set.add("hello");
		set.add("world");
		set.add("again");
		
		//遍历set集合
		for(String s:set) {
			System.out.println(s);
		}
		System.out.println("=============");
		//创建Set集合,用于存储String类型的对象元素，使用TreeSet作为具体实现
		//存入到TreeSet集合中的元素会按照规则进行排序
		Set<String> set2 = new TreeSet<>();
		//添加元素
		set2.add("我");
		set2.add("你");
		set2.add("他");
		//使用迭代器遍历集合
		Iterator<String> itr = set2.iterator();
		while(itr.hasNext()) {
			String s = itr.next();
			System.out.println(s);
		}
		//Set集合没有get()方法
		//Set集合的无序不重复如何实现的?
		//Hash算法/哈希算法/散列算法
		//常用的是除法算法，通过对象的哈希值来计算对象在容器中的位置
		System.out.println(new Object());
		//对于要放在Hash中的元素必须重写equals方法并且重写hashCode方法
		
		Set<Student> students = new HashSet<>();
		students.add(new Student("张三", 1000, "男"));
		students.add(new Student("张四", 1001, "男"));
		students.add(new Student("张三", 1002, "女"));
		
		for(Student s:students) {
			System.out.println(s);
		}
	}
}	

class Student {
	
	public String name;
	public Integer id;
	public String gender;
	public Student(String name, Integer id, String gender) {
		super();
		this.name = name;
		this.id = id;
		this.gender = gender;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", id=" + id + ", gender=" + gender + "]";
	}
	
	@Override//重写hashCode()保证id相同的对象会有相同的hash值	
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}
	
	
}
